package com.example.dormitory_system.utils;

import com.example.dormitory_system.domain.enetiy.Building;
import com.example.dormitory_system.domain.enetiy.Room;
import com.example.dormitory_system.domain.enetiy.Student;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.InputStream;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ExcelUtil {

    public static List<Building> readBuildingsFromExcel(InputStream inputStream) throws Exception {
        List<Building> buildings = new ArrayList<>();
        Workbook workbook = new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        Iterator<Row> rowIterator = sheet.iterator();

        // Skip the header row
        if (rowIterator.hasNext()) {
            rowIterator.next();
        }

        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            Building building = new Building();
//            building.setBuildingId((long) row.getCell(0).getNumericCellValue());
            /**
             * 从Excel行数据解析并设置楼宇信息实体
             *
             * 重要说明：
             * 1. 单元格索引从0开始计数，对应Excel列顺序为：A(0),B(1),C(2)...
             * 2. 各字段对应关系：
             *    - B列(1): 楼宇名称（字符串类型）
             *    - C列(2): 所属校区（字符串类型）
             *    - D列(3): 楼层数（数值类型，强制转换为整型）
             *    - E列(4): 负责人姓名（字符串类型）
             *    - F列(5): 联系电话（字符串类型）
             *
             * 注意：实际使用前需校验单元格类型，避免类型不匹配异常
             * （如第3列应为NUMERIC类型，第5列需确保电话格式正确）
             */
            // 核心数据映射块：将Excel行数据转换为领域对象
            building.setBuildingName(String.valueOf((int) row.getCell(1).getNumericCellValue()));
            building.setCampus(row.getCell(2).getStringCellValue());
            building.setFloorCount((int) row.getCell(3).getNumericCellValue());
            building.setUserName(row.getCell(4).getStringCellValue());
            building.setManagerPhone(String.valueOf((int) row.getCell(5).getNumericCellValue()));
            buildings.add(building);
        }
        workbook.close();
        return buildings;
    }

    public static List<Room> readRoomsFromExcel(InputStream inputStream) throws Exception {
        List<Room> rooms = new ArrayList<>();
        Workbook workbook = new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        Iterator<Row> rowIterator = sheet.iterator();

        // Skip the header row
        if (rowIterator.hasNext()) {
            rowIterator.next();
        }

        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            Room room = new Room();
//            room.setRoomId((long) row.getCell(0).getNumericCellValue());
            /**
             从Excel行数据解析并设置房间实体属性

             代码块功能：
             从Excel行对象(row)的不同单元格中提取数据
             将单元格数据转换为对应数据类型
             设置房间对象(room)的完整属性信息

             单元格对应关系：
             单元格1（索引1）：房间名称（字符串类型）
             单元格2（索引2）：建筑ID（长整型数值）
             单元格3（索引3）：总床位数（整型数值）
             单元格4（索引4）：可用床位数（整型数值）
             单元格5（索引5）：所属学院（字符串类型） */
            room.setRoomName(String.valueOf((int) row.getCell(1).getNumericCellValue()));
            room.setBuildingId((long) row.getCell(2).getNumericCellValue());
            room.setBedCount((int) row.getCell(3).getNumericCellValue());
//            room.setAvailableBeds((int) row.getCell(4).getNumericCellValue());
            room.setCollege(row.getCell(4).getStringCellValue());
            rooms.add(room);
        }

        workbook.close();
        return rooms;
    }

    public static List<Student> readStudentsFromExcel(InputStream inputStream) throws Exception {
        List<Student> students = new ArrayList<>();
        Workbook workbook = new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        Iterator<Row> rowIterator = sheet.iterator();

        // Skip the header row
        if (rowIterator.hasNext()) {
            rowIterator.next();
        }

        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            Student student = new Student();
//            student.setStudentId((long) row.getCell(0).getNumericCellValue());
            /**
             * 从Excel行数据中提取学生基础信息并设置到学生对象中
             * 单元格对应关系：
             * 单元格[1] -> 学生姓名
             * 单元格[2] -> 用户账号
             * 单元格[3] -> 登录密码
             */
            student.setName(row.getCell(1).getStringCellValue());
            student.setUsername(String.valueOf((int) row.getCell(2).getNumericCellValue()));
            student.setPassword(String.valueOf((int) row.getCell(3).getNumericCellValue()));
            student.setBuildingName(String.valueOf((int) row.getCell(4).getNumericCellValue()));
            student.setRoomName(String.valueOf((int) row.getCell(5).getNumericCellValue()));
            student.setCollege(row.getCell(6).getStringCellValue());
            student.setMajor(row.getCell(7).getStringCellValue());
            student.setStuClass(row.getCell(8).getStringCellValue());
            String stringCellValue = row.getCell(9).getStringCellValue();
            LocalDate localDate = LocalDate.parse(stringCellValue);
            student.setAdmissionDate(localDate);
            students.add(student);
            System.out.println(students.size());
        }
        System.out.println(students.size());
        workbook.close();
        return students;
    }
}